package com.sprouting.personal.model.entity;

import com.baomidou.mybatisplus.annotation.FieldStrategy;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.sprouting.personal.annotations.CheckLength;
import com.sprouting.personal.annotations.CheckNotNull;
import com.sprouting.personal.model.common.BaseModel;
import com.sprouting.personal.model.common.jsr.AddGroup;
import com.sprouting.personal.model.common.jsr.UpdGroup;
import lombok.Data;

import javax.validation.constraints.Null;

/**
 * 系统配置表
 * 系统配置表的设计如下，如果是code是-1则是所有人的公共配置，用户开始是没有自己的配置的，如果修改了
 * 自己的配置，则会将 -1的复制一份到自己的里面
 * @see com.sprouting.personal.interfaces.common.Constant.ConfigCode
 *
 * @author ：LX（长沙麓谷）
 * @date 创建时间： 2022/8/24 0:21
 */
@Data
@TableName("ps_config")
public class Config extends BaseModel {

    /**
     * 主键
     */
    @TableId
    @CheckNotNull(message = "非法ID", groups = UpdGroup.class)
    @Null(message = "无效ID", groups = AddGroup.class)
    private String id;
    /**
     * 配置名称
     */
    @CheckNotNull(message = "配置名称异常")
    private String name;
    /**
     * 所属用户，默认基础数据为 {@link com.sprouting.personal.interfaces.common.Constant.DefaultValue#STRING} 这是基础数据，不能删除，不能修改，所有用户会再复制一份
     * @see User#getId()
     */
    private String userId;
    /**
     * 键-代码
     * @see com.sprouting.personal.interfaces.common.Constant.ConfigCode
     */
    @CheckNotNull(message = "配置代码异常")
    private String code;
    /**
     * 值
     * 该值可以为空
     *      FieldStrategy
     *          - ignored  不管有没有有设置属性，所有的字段都会设置到insert语句中，如果没设置值，全为null，这种在update 操作中会有风险，把有值的更新为null
     *          - not_null,也是默认策略，也就是忽略null的字段，不忽略""
     *          - not-empty  为null，为空串的忽略，就是如果设置值为null，“”，不会插入数据库
     */
    @CheckLength(max = 400, message = "配置值超过长度限制")
    @TableField(updateStrategy = FieldStrategy.IGNORED)
    private String value;
    /**
     * 备注
     */
    private String remark;
}
